package main

import (
	"bufio"
	"fmt"
	"log"
	"os"
	"path/filepath"
	"strings"
	"time"

	"github.com/go-vgo/robotgo"
	"github.com/lxn/win"
	"golang.org/x/sys/windows/registry"
)

// 配置参数
const (
	wechatRegPath  = `Software\Tencent\WeChat`
	defaultWechatPath = `D:\Program Files (x86)\Tencent\WeChat\wechat.exe`
	linksFileName  = "links.txt"
	logFileName    = "调试日志.txt"
	targetChat     = "文件传输助手"
	shareTarget    = "日出东方"
	interval       = 60 * time.Second // 每分钟执行一次
)

// 鼠标点击坐标（与原AHK脚本保持一致）
var (
	linkPosition     = [2]int{530, 569}  // 打开链接坐标
	shareButton1     = [2]int{310, 41}   // 第一个分享按钮坐标
	shareButton2     = [2]int{115, 176}  // 第二个分享按钮坐标
	confirmShareBtn  = [2]int{390, 400}  // 确认分享按钮坐标
	closeWindowBtn   = [2]int{383, 43}   // 关闭窗口按钮坐标
)

func main() {
	// 初始化日志
	log.SetOutput(getLogFile())
	log.Println("脚本已启动!")
	log.Println("设置定时任务")
	
	// 立即执行一次
	sendLink()
	
	// 设置定时器
	ticker := time.NewTicker(interval)
	defer ticker.Stop()
	
	for range ticker.C {
		log.Println("每分钟执行检查")
		sendLink()
	}
}

// 发送链接的主函数
func sendLink() {
	log.Println("检查微信")
	
	// 检查并启动微信
	if !isWechatRunning() {
		wechatPath, err := getWechatPath()
		if err != nil {
			log.Printf("获取微信路径失败，使用默认路径: %v", err)
			wechatPath = defaultWechatPath
		}
		
		log.Println("打开微信程序")
		err = runWechat(wechatPath)
		if err != nil {
			log.Printf("启动微信失败: %v", err)
			return
		}
		time.Sleep(5 * time.Second) // 等待微信启动
	} else {
		log.Println("激活微信窗口")
		activateWechatWindow()
		time.Sleep(1 * time.Second)
	}
	
	// 读取链接文件
	log.Println("读取链接文件")
	links, err := readLinksFile()
	if err != nil {
		log.Printf("读取链接文件失败: %v", err)
		return
	}
	
	// 查找并处理第一个有效链接
	log.Println("开始查找链接")
	for i, link := range links {
		link = strings.TrimSpace(link)
		log.Println(link)
		
		// 跳过空行和已发送的链接
		if link == "" || strings.HasPrefix(link, "*") {
			continue
		}
		
		// 处理小程序链接
		if strings.HasPrefix(link, "#") {
			// 切换到文件传输助手
			log.Println("切换到文件传输助手")
			switchToChat(targetChat)
			
			// 发送小程序链接
			sendWechatMessage(link)
			log.Println("小程序链接已发送到文件传输助手")
			time.Sleep(3 * time.Second)
			
			// 打开刚发送的链接
			log.Println("打开链接")
			clickPosition(linkPosition[0], linkPosition[1])
			time.Sleep(3 * time.Second)
			
			// 点击分享按钮
			log.Println("点击分享按钮")
			clickPosition(shareButton1[0], shareButton1[1])
			time.Sleep(1500 * time.Millisecond)
			
			// 点击分享到聊天
			log.Println("点击分享按钮")
			clickPosition(shareButton2[0], shareButton2[1])
			time.Sleep(1500 * time.Millisecond)
			
			// 输入目标联系人并确认
			sendKeyboardInput(shareTarget)
			robotgo.KeyTap("enter")
			time.Sleep(1500 * time.Millisecond)
			
			// 确认分享
			clickPosition(confirmShareBtn[0], confirmShareBtn[1])
			time.Sleep(2 * time.Second)
			log.Println("小程序链接已成功分享到日出东方")
			
			// 关闭小程序窗口
			clickPosition(closeWindowBtn[0], closeWindowBtn[1])
			time.Sleep(2 * time.Second)
			
			// 更新链接状态为已发送
			links[i] = "*" + link
			err := updateLinksFile(links)
			if err != nil {
				log.Printf("更新链接文件失败: %v", err)
			}
			
			log.Println("小程序分享成功")
			log.Println("发送任务完成")
			log.Println("--------------------------")
			log.Println("等待下一个执行周期")
			return
		} else {
			log.Println("发现普通链接，不分享")
		}
	}
	
	log.Println("-------------")
}

// 检查微信是否正在运行
func isWechatRunning() bool {
	hwnd := win.FindWindow(nil, syscall.StringToUTF16Ptr("微信"))
	return hwnd != 0
}

// 获取微信安装路径
func getWechatPath() (string, error) {
	key, err := registry.OpenKey(registry.CURRENT_USER, wechatRegPath, registry.QUERY_VALUE)
	if err != nil {
		return "", err
	}
	defer key.Close()
	
	path, _, err := key.GetStringValue("InstallPath")
	if err != nil {
		return "", err
	}
	
	exePath := filepath.Join(path, "WeChat.exe")
	if _, err := os.Stat(exePath); err == nil {
		return exePath, nil
	}
	
	return "", fmt.Errorf("微信可执行文件不存在")
}

// 启动微信
func runWechat(path string) error {
	cmd := exec.Command(path)
	return cmd.Start()
}

// 激活微信窗口
func activateWechatWindow() {
	hwnd := win.FindWindow(nil, syscall.StringToUTF16Ptr("微信"))
	if hwnd != 0 {
		win.ShowWindow(hwnd, win.SW_RESTORE)
		win.SetForegroundWindow(hwnd)
	}
}

// 读取链接文件
func readLinksFile() ([]string, error) {
	file, err := os.Open(linksFileName)
	if err != nil {
		if os.IsNotExist(err) {
			// 如果文件不存在，创建一个空文件
			_, err := os.Create(linksFileName)
			return []string{}, err
		}
		return nil, err
	}
	defer file.Close()
	
	var links []string
	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		links = append(links, scanner.Text())
	}
	
	return links, scanner.Err()
}

// 更新链接文件，标记已发送的链接
func updateLinksFile(links []string) error {
	file, err := os.Create(linksFileName)
	if err != nil {
		return err
	}
	defer file.Close()
	
	writer := bufio.NewWriter(file)
	for _, link := range links {
		if link != "" {
			_, err := writer.WriteString(link + "\n")
			if err != nil {
				return err
			}
		}
	}
	
	return writer.Flush()
}

// 切换到指定聊天窗口
func switchToChat(chatName string) {
	// 模拟Ctrl+F打开搜索
	robotgo.KeyTap("f", "ctrl")
	time.Sleep(800 * time.Millisecond)
	
	// 输入聊天名称并回车
	robotgo.TypeStr(chatName)
	time.Sleep(500 * time.Millisecond)
	robotgo.KeyTap("enter")
	time.Sleep(2 * time.Second)
}

// 发送微信消息
func sendWechatMessage(message string) {
	robotgo.TypeStr(message)
	time.Sleep(500 * time.Millisecond)
	robotgo.KeyTap("enter")
}

// 点击指定位置
func clickPosition(x, y int) {
	robotgo.MoveMouse(x, y, 0)
	robotgo.Click()
}

// 获取日志文件
func getLogFile() *os.File {
	file, err := os.OpenFile(logFileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
	if err != nil {
		log.Fatalf("无法打开日志文件: %v", err)
	}
	return file
}

// 辅助函数：将字符串转换为UTF16指针
func strToUTF16Ptr(s string) *uint16 {
	return syscall.StringToUTF16Ptr(s)
}